<?php
// SFTP
function do_sftp()
{
        $IN_FILE = '../services/rdiffbackup/in';
        $OUT_FILE = '/var/log/sftp-backup';
	$CONF_FILE = '/etc/rdiff-backup-sftp';
	global $GET;
	require '../inc/rwINIfile.php';


	if( $_POST['b_ok'] || $_POST['b_apply'] || $_POST['b_sftpnow'] ) {
		// skapa array över data att spara
		$filebuf = array();
		$filebuf['data']['user'] = $_POST['user'];
		$filebuf['data']['passwd'] = $_POST['passwd'];

		if( isset($_POST['system']) )
			$filebuf['data']['include_system'] = 'true';
		if( isset($_POST['mail']) )
			$filebuf['data']['include_mail'] = 'true';
		if( isset($_POST['groupware']) )
			$filebuf['data']['include_groupware'] = 'true';

		if( isset($_SESSION['ajax_dirlist']['backuptree']['checked']) )
			$filebuf['included_files'] = $_SESSION['ajax_dirlist']['backuptree']['checked'];

		// skapa fil att sätta rättigheter på (så ingen obehörig läser lösen)
		touch($CONF_FILE);
		// sätter rättigheter på fil och skriver till den om allt gick som det ska
		if( chown($CONF_FILE, 0) && chmod($CONF_FILE, 0500) ) {
			writeINIfile($CONF_FILE, $filebuf, '#', 'konfigurationsfil för fjärrbackup');
		}
		else {
			echo "\nFEL: kunde inte skapa eller sätta rättighet på konfigurationsfil";
			exit;
		}

	   // Bygg ihop cronjobb-sträng
		$days = array('mon','tue','wed','thu','fri','sat','sun');
		$hours = array('00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23');
		$cron="";
		foreach( $days AS $day ) {
			$cron_hours = "";
			foreach( $hours AS $hour ) {
				if( isset($_POST[$day.$hour]) ) {
					$cron_hours .= ",$hour";
				}
			}
			if( $cron_hours != "" ) {
				$cron_hours = substr($cron_hours, 1);
				$cron .= "0 $cron_hours * * $day root /usr/share/uggla/services/rdiffbackup/sftp_rdiff_wwwadmin backup &> $OUT_FILE\n";
			}
		}

	    // Ska autobackup genomföras så spara i cron	
		if( $cron != "" ) {
			file_put_contents("/etc/cron.d/sftp_rdiff_backup",$cron);
			info('saved');
		}
	    // Om ingen autobackup ska genomföras så radera cron-fil
		else {
			@unlink("/etc/cron.d/sftp_rdiff_backup");
			info('saved');
		}

	    // Utför backup nu
		if( isset($_POST['b_sftpnow']) ) {
			exec('echo "" > '.$IN_FILE);
			exec('echo "" > '.$OUT_FILE);
			exec("nohup /sbin/start-stop-daemon --start -m -p '/var/run/sftp-rdiff.pid' --startas ../services/rdiffbackup/sftp_rdiff_wwwadmin backup < $IN_FILE > /dev/null 2>&1 &");
			$GET['part']='sftprunning';
		}
	}
// Stoppa pågående backup
        else if( isset($_POST['stopsftp']) ) {
                exec('start-stop-daemon -p "/var/run/sftp-rdiff.pid" --stop');
		exec('pkill -P `pgrep "^sftp_rdiff_www"`');
                $GET['part']='stopped';
        }
// Visa pågående backup
	else if( isset($_POST['showsftp']) ) {
		$GET['part']='sftprunning';
	}
}


// USB
function do_usb()
{
        global $GET, $BASE_DIR;
        $IN_FILE = "$BASE_DIR/services/rdiffbackup/in";
        $OUT_FILE = '/var/log/usb-backup.log';
        $LOCK_FILE = '/var/run/uggla_rdiff_usb_backup.lock';
	$CONF_FILE = '/etc/rdiff-backup-usb';
	$CRON_FILE = '/etc/cron.d/rdiff_backup';
	$EXEC_FILE = "$BASE_DIR/services/rdiffbackup/usb_rdiff_wwwadmin";
	$PID_FILE = '/var/run/usb-rdiff.pid';
	require "$BASE_DIR/inc/rwINIfile.php";

	if( $_POST['b_ok'] || $_POST['b_apply'] || $_POST['b_usbnow'] ) {
		// skapa array över data att spara
		$filebuf = array();

		if( isset($_POST['system']) )
			$filebuf['data']['include_system'] = 'true';
		if( isset($_POST['mail']) )
			$filebuf['data']['include_mail'] = 'true';
		if( isset($_POST['groupware']) )
			$filebuf['data']['include_groupware'] = 'true';

		if( isset($_POST['removetime']) )
			$filebuf['data']['remove_older_than'] = $_POST['removetime'];

		if( isset($_SESSION['ajax_dirlist']['backuptree']['checked']) )
			$filebuf['included_files'] = $_SESSION['ajax_dirlist']['backuptree']['checked'];

		// skapa fil att sätta rättigheter på (så ingen obehörig läser lösen)
		touch($CONF_FILE);
		// sätter rättigheter på fil och skriver till den om allt gick som det ska
		if( chown($CONF_FILE, 0) && chmod($CONF_FILE, 0500) ) {
			writeINIfile($CONF_FILE, $filebuf, '#', 'konfigurationsfil för usbbackup');
		}
		else {
			echo "\nFEL: kunde inte skapa eller sätta rättighet på konfigurationsfil";
			exit;
		}

	   // Bygg ihop cronjobb-sträng
		$days = array('mon','tue','wed','thu','fri','sat','sun');
		$hours = array('00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23');
		$cron="";
		foreach( $days AS $day ) {
			$cron_hours = "";
			foreach( $hours AS $hour ) {
				if( isset($_POST[$day.$hour]) ) {
					$cron_hours .= ",$hour";
				}
			}
			if( $cron_hours != "" ) {
				$cron_hours = substr($cron_hours, 1);
				$cron .= "0 $cron_hours * * $day root $EXEC_FILE backup > $OUT_FILE 2>&1\n";
			}
		}

	    // Ska autobackup genomföras så spara i cron	
		if( $cron != "" ) {
			file_put_contents($CRON_FILE, $cron);
			info('saved');
		}
	    // Om ingen autobackup ska genomföras så radera cron-fil
		else {
			@unlink($CRON_FILE);
			info('saved');
		}

	    // Utför backup nu
		if( isset($_POST['b_usbnow']) ) {
			exec('echo "" > '.$IN_FILE);
			exec('echo "" > '.$OUT_FILE);
			exec("nohup /sbin/start-stop-daemon --start -m -p '$PID_FILE' --startas $EXEC_FILE backup < $IN_FILE > /dev/null 2>&1 &");
			$GET['part']='usbrunning';
		}
	}
// Stoppa pågående backup
        else if( isset($_POST['stopbackup']) ) {
                exec("start-stop-daemon -p '$PID_FILE' --stop");
		exec('pkill -P `pgrep "^usb_rdiff_www"`');
                $GET['part']='stopped';
        }
// Visa pågående backup
	else if( isset($_POST['showusb']) ) {
		$GET['part']='usbrunning';
	}
// Gör till backupenhet
	else if( isset($_POST['dobackupdev']) ) {
		exec("nohup /sbin/start-stop-daemon --start -m -p '$PID_FILE' --startas $EXEC_FILE setdevice > /dev/null 2>&1 &");
	}
}


function do_usbrestore()
{
// Återställ från USB-backup
	global $GET;

        $IN_FILE = '../services/rdiffbackup/in';
        $OUT_FILE = '/var/log/usb-backup.log';

	// Kontrollerar om återställningsmetod är vald
	if( isset($_POST['restoretype']) ) {
		$restoretype = $_POST['restoretype'];

		// Om 'Hämta enskilda filer och kataloger'
		if( $restoretype == 'get' ) {
			$GET['restoretype'] = 'get';
			if( isset($_POST['b_rtime']) ) {
				$GET['rtime']=intval($_POST['rtime']);
				if( isset($_POST['directory']) )
					$GET['directory']=$_POST['directory'];
			}
			else if( isset($_POST['b_rstart']) && isset($_POST['rtime']) && $_POST['directory'] ) {
				$rtime = intval($_POST['rtime']);
				$savedir = str_replace(" ", "\\ ", '/home/'.$_POST['directory'].'/restore/');
				$restorefiles = '';

				$restorearr = $_SESSION['ajax_dirlist']['restoretree']['checked'];
				unset( $_SESSION['ajax_dirlist'] );

				foreach( $restorearr AS $name ) {
					$restorefiles .= "\"$name\" ";
				}
				$line = "../services/rdiffbackup/usb_rdiff_wwwadmin restore $rtime $restorefiles \"$savedir\"";
				exec('echo "" > '.$IN_FILE);
				exec('echo "" > '.$OUT_FILE);
				exec("nohup $line < $IN_FILE > $OUT_FILE  2>&1 &");

				$GET['part']='usbrunning';
			}
		}
		// OM 'Hoppa tillbaka till en tidigare tidpunkt'
		elseif( $restoretype == 'jump' ) {
			$GET['restoretype'] = 'jump';
			if( isset($_POST['b_jtime']) ) {
				$GET['jtime']=intval($_POST['jtime']);
				if( isset($_POST['directory']) )
					$GET['directory']=$_POST['directory'];
				if( isset($_POST['jtime']) )
					$GET['jtime'] = $_POST['jtime'];
				$GET['restoretype'] = 'jump';
			}
			elseif( isset($_POST['b_jstart']) && isset($_POST['jtime']) ) {
				$jtime = intval($_POST['jtime']);
				$flags = '-';

				if( isset($_POST['homes']) )
					$flags .= 'h';
				if( isset($_POST['shares']) )
					$flags .= 's';
				if( isset($_POST['system']) )
					$flags .= 'c';
				if( isset($_POST['mail']) )
					$flags .= 'm';
				if( isset($_POST['groupware']) )
					$flags .= 'g';
				
				$line = "../services/rdiffbackup/usb_rdiff_wwwadmin revert $jtime $flags";
				exec('echo "" > '.$IN_FILE);
				exec('echo "" > '.$OUT_FILE);
				exec("nohup $line < $IN_FILE > $OUT_FILE  2>&1 &");

				$GET['part']='usbrunning';
			}
		}
	}
	// Återställ till tidigare lyckad backup
	else if( isset($_POST['b_usbrevert']) ) {
		exec('echo "" > '.$OUT_FILE);
		exec("nohup ../services/rdiffbackup/usb_rdiff_wwwadmin check > $OUT_FILE 2> $OUT_FILE &");
		$GET['part']='usbrunning';
	}
	// Stoppa pågående backup
        else if( isset($_POST['stopbackup']) ) {
                exec("start-stop-daemon -p '$PID_FILE' --stop");
		exec('pkill -P `pgrep "^usb_rdiff_www"`');
                $GET['part']='stopped';
        }
}


//////////////////////////////

if( isset($_REQUEST['t']) ) {
	switch( $_REQUEST['t'] ) {
	case 'usb':
		do_usb();
		break;
	case 'sftp':
		do_sftp();
		break;
	case 'usbrestore':
		do_usbrestore();
		break;
	}
}
else {
	do_usb();
}
?>
